_ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee, _ffff_tttt_rrrr_yyyy_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee, and _ffff_uuuu_nnnn_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee provide for explicit locking and
unlocking of stdio streams. They may be used by a thread to delineate a
sequence of I/O statements to be executed as a critical section.
_ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee is used by a thread to acquire exclusive use of _f_i_l_e.
_ffff_tttt_rrrr_yyyy_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee is used by a thread to acquire exclusive use of _f_i_l_e if it
is available; _ffff_tttt_rrrr_yyyy_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee is a nonblocking version of _ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee.
_ffff_tttt_rrrr_yyyy_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee returns zero if it successfully acquires the lock, otherwise
a nonzero value is returned.
_ffff_uuuu_nnnn_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee is used to give up the exclusive control granted to the
thread.
Logically, there is a lock count associated with _f_i_l_e. The count is
implicitly initialized to 0 when the _f_i_l_e is opened. _f_i_l_e is unlocked
when the count is 0. When the count is positive a single thread holds
the lock. Each call to _ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee (or successful call to _ffff_tttt_rrrr_yyyy_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee)
increments the lock count while each call to _ffff_uuuu_nnnn_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee decrements the
lock count. When the lock count is non-zero, threads not holding the
lock on _f_i_l_e that call _ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee will suspend and wait for the count to
return to 0. The thread holding the lock on _f_i_l_e does not suspend itself
on multiple calls to _ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee, allowing for the nesting of matching
calls to _ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee (or successful calls to _ffff_tttt_rrrr_yyyy_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee) and _ffff_uuuu_nnnn_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee.
All functions in stdio use these functions to guarantee reentrancy. All
reentrant macros behave as if they are surrounded by calls to _ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee
and _ffff_uuuu_nnnn_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee.
The feature test macro ______SSSS_GGGG_IIII______RRRR_EEEE_EEEE_NNNN_TTTT_RRRR_AAAA_NNNN_TTTT______FFFF_UUUU_NNNN_CCCC_TTTT_IIII_OOOO_NNNN_SSSS should be defined to make
these functions visible.
The semantics of _ffff_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee, _ffff_tttt_rrrr_yyyy_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee, and _ffff_uuuu_nnnn_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee are undefined
if _f_i_l_e is not a valid (_F_I_L_E *) object. Calling _ffff_uuuu_nnnn_llll_oooo_cccc_kkkk_ffff_iiii_llll_eeee without